package com.edu.jvm.unit01.heap;

/**
 * 逃逸分析
 * 如何快速的判断是否发生了逃逸，就看new的对象实体是否有可能在方法外被调用。
 * 思考：如果当前的成员属性(instance)声明为static的？仍然会发生逃逸
 * 结论：开发中能使用局部变量的，就不要在方法外定义
 * @author five-five
 * @date 2021/9/17-9:06
 */
public class EscapeAnalysis {
    public EscapeAnalysis instance;

    /**
     * 方法返回EscapeAnalysis对象，发生逃逸
     *
     * @return EscapeAnalysis
     */
    public EscapeAnalysis getInstance() {
        return instance == null ? new EscapeAnalysis() : instance;
    }

    /**
     * 为成员属性赋值，发生逃逸
     */
    public void setInstance() {
        this.instance = new EscapeAnalysis();
    }

    /**
     * 对象的作用域仅在当前方法中有效，没有发生逃逸
     */
    public void useEscapeAnalysis(){
        EscapeAnalysis e = new EscapeAnalysis();
    }

    /**
     * 引用成员变量的值，发生逃逸
     */
    public void useEscapeAnalysis2(){
        EscapeAnalysis e = getInstance();
    }

}
